package com.gl.glcourses.repository.jpa;

import java.util.List;

import javax.persistence.Query;

import org.springframework.stereotype.Repository;

import com.gl.glcourses.repository.IUsuarioRepository;
import com.gl.glcourses.vos.Oficina;
import com.gl.glcourses.vos.TipoUsuario;
import com.gl.glcourses.vos.Usuario;

@Repository
public class JpaUsuarioRepository extends JpaProjectRepository<Usuario> implements IUsuarioRepository<Usuario>{

	
	@Override
	public Usuario findUsuario(String nombre) {
		Class clase=Usuario.class;
		try {

			Query query = em.createQuery("FROM " + clase.getSimpleName()
					+ " as usuario WHERE usuario.nombre = :param");
			query.setParameter("param", nombre);
			return (Usuario) query.getSingleResult();

		} catch (Exception e) {
			return null;
		}
	}

	@Override
	public Usuario saveUsuarioAndUpdate(Usuario usuario) throws Exception {
		Usuario persistUser;
		persistUser=this.saveUpdate(usuario);
		return persistUser;
	}

	@Override
	public List<Usuario> buscarTipodeUsuarios(TipoUsuario tipoUsuario) {
		Query query = null;
		try {
			query = em.createQuery("FROM Usuario as obj WHERE obj.tipoUsuario = :param");
			query.setParameter("param", tipoUsuario);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return query.getResultList();
	}
	
	public List<Usuario> buscarUsuariosXOficinas(Oficina oficina) {
		Query query = null;
		try {
			query = em.createQuery("FROM Usuario as obj WHERE obj.oficina.nombre =:param2 and obj.tipoUsuario = :param");
			query.setParameter("param", TipoUsuario.PM);
			query.setParameter("param2", oficina.getNombre());
		} catch (Exception e) {
			e.printStackTrace();
		}
		Usuario usua=(Usuario) query.getResultList().get(0);
		System.out.println(usua.getNombre());
		
		return query.getResultList();
	}
	
	public List<Usuario> buscarUsuariosACargo(Usuario usuario) {
		Query query = null;
		try {
			query = em.createQuery("FROM Usuario as obj WHERE obj.manager =:param");
			query.setParameter("param", usuario.getId());
		} catch (Exception e) {
			e.printStackTrace();
		}
		return query.getResultList();
	}

	@Override
	public List<Usuario> buscarUsuarios() {
		Query query = null;
		try {
			query = em.createQuery("FROM Usuario");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return query.getResultList();
	}
	
	public List<Usuario> buscarUsuariosSimplesXOficinas(Oficina oficina) {
		Query query = null;
		try {
			query = em.createQuery("FROM Usuario as obj WHERE obj.oficina.nombre =:param");
			query.setParameter("param", oficina.getNombre());
		} catch (Exception e) {
			e.printStackTrace();
		}
		Usuario usua=(Usuario) query.getResultList().get(0);
		System.out.println(usua.getNombre());
		
		return query.getResultList();
	}

	@Override
	public List<Usuario> busarUsuariosSinOficinas() {
		Query query = null;
		try {
			query = em.createQuery("FROM Usuario as obj WHERE obj.oficina IS NULL");
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return query.getResultList();
	}

}
